// 链栈节点类（内部静态类，仅链栈使用）
class Node<T> {
    T data; // 节点存储的元素
    Node<T> next; // 指向下一个节点的引用

    public Node(T data) {
        this.data = data;
        this.next = null;
    }
}

public class LinkedStack<T> implements StackInterface<T> {
    private Node<T> top; // 栈顶节点（null表示空栈）
    private int size; // 栈中元素个数

    // 构造方法：初始化空链栈
    public LinkedStack() {
        this.top = null;
        this.size = 0;
    }

    // 判断栈是否为空
    @Override
    public boolean isEmpty() {
        return top == null;
    }

    // 链栈无容量限制，始终返回false
    @Override
    public boolean isFull() {
        return false;
    }

    // 入栈操作：新节点作为栈顶，指向原栈顶
    @Override
    public void push(T data) {
        Node<T> newNode = new Node<>(data);
        newNode.next = top; // 新节点的next指向原栈顶
        top = newNode; // 栈顶更新为新节点
        size++; // 元素个数加1
    }

    // 出栈操作：移除栈顶节点，返回其元素
    @Override
    public T pop() {
        if (isEmpty()) {
            throw new RuntimeException("链栈为空，无法执行pop操作");
        }
        T data = top.data; // 获取栈顶元素
        top = top.next; // 栈顶更新为下一个节点
        size--; // 元素个数减1
        return data;
    }

    // 查看栈顶元素
    @Override
    public T peek() {
        if (isEmpty()) {
            throw new RuntimeException("链栈为空，无法执行peek操作");
        }
        return top.data;
    }

    // 获取栈元素个数
    @Override
    public int size() {
        return size;
    }

    // 清空栈：栈顶置空，size重置为0
    @Override
    public void clear() {
        top = null;
        size = 0;
    }
}